/**
 * File Name	: FixedFSpec.cpp
 * Location		: /Data/
 * Lib.Name		: Data.a
 * Designer		: OS (12-09-06)
 */

#include "stdafx.h"
#include "FSpec.h"

namespace Core
{

	FSpec::FSpec()
	{
	}

	FSpec::~FSpec()
	{
	}

	void FSpec::Init()
	{
	}

	void FSpec::Reset()
	{
		for(unsigned int i=0; i<m_DataItems.size(); i++)
		{
			if(m_DataItems[i]!=NULL)
			{
				m_DataItems[i]->Reset();
				m_DataItems[i]->Unset();
			}
		}
	}

	void FSpec::ReadRawData(Core::RawData &p_Data)
	{
		unsigned char t_FrnStatuses[8];
		for(int i=0; i<8; i++) t_FrnStatuses[i] = 0;
		for(unsigned int i=0; i<((m_DataItems.size()+6)/7); i++)
		{
			t_FrnStatuses[i] = p_Data.ReadChar();
			if(!(t_FrnStatuses[i]&0x1)) break;
		}
		for(unsigned int i=0; i<m_DataItems.size(); i++)
		{
			if(m_DataItems[i]==NULL) continue;
			if((t_FrnStatuses[i/7] & (1<<(7-(i%7)))) > 0)
			{
				m_DataItems[i]->ReadRawData(p_Data);
				m_DataItems[i]->Set();
			}
		}
		Init();
	}

	void FSpec::WriteRawData(Core::RawData &p_Data)
	{
		Init();
		char t_FrnStatuses[8];
		for(unsigned int i=0; i<((m_DataItems.size()+6)/7); i++)
		{
			t_FrnStatuses[i] = 1;
		}
		t_FrnStatuses[((m_DataItems.size()+6)/7)-1] = 0;
		for(unsigned int i=0; i<m_DataItems.size(); i++)
		{
			if(m_DataItems[i]==NULL) continue;
			if(m_DataItems[i]->Isset())
			{
				t_FrnStatuses[i/7] |= 1<<(7-(i%7));
			}
		}
		for(unsigned int i=0; i<((m_DataItems.size()+6)/7); i++)
		{
			p_Data.WriteChar(t_FrnStatuses[i]);
		}
		for(unsigned int i=0; i<m_DataItems.size(); i++)
		{
			if(m_DataItems[i]==NULL) continue;
			if(m_DataItems[i]->Isset())
			{
				m_DataItems[i]->WriteRawData(p_Data);
			}
		}
	}

}
